package com.xy.work.template.base.utils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 /**
 * @Auther: niuniu
 * @Date: 2021/5/14 06:13
 * @Description: 一些常用的验证
 */

public class CheckStrUtil {

//------------------常量定义
    /**
        * Email正则表达式="^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
        */
    /**
     * 手机QQ
     */
    public static final String QQ = "[1-9][0-9]{4,14}";
    public static final String EMAIL = "\\w+(\\.\\w+)*@\\w+(\\.\\w+)+";
    /**
     *    * 电话号码正则表达式= (^(\d{2,4}[-_－—]?)?\d{3,8}([-_－—]?\d{3,8})?([-_－—]?\d{1,7})?$)|(^0?1[35]\d{9}$)
     *    
     */
    public static final String PHONE = "(^(\\d{2,4}[-_－—]?)?\\d{3,8}([-_－—]?\\d{3,8})?([-_－—]?\\d{1,7})?$)|(^0?1[35]\\d{9}$)";
    /**
     *    * 手机号码正则表达式=^(13[0-9]|14[0-9]|15[0-9]|17[0-9]|18[0-9])\d{8}$
     *    
     */
    public static final String MOBILE = "^(13[0-9]|14[0-9]|15[0-9]|16[0-9]|17[0-9]|18[0-9]|19[0-9])\\d{8}$";

    /**
     *    * Integer正则表达式 ^-?(([1-9]\d*$)|0)
     *    
     */
    public static final String INTEGER = "^-?(([1-9]\\d*$)|0)";
    /**
     *    * 正整数正则表达式 >=0 ^[1-9]\d*|0$
     *    
     */
    public static final String INTEGER_NEGATIVE = "^[1-9]\\d*|0$";
    /**
     *    * 负整数正则表达式 <=0 ^-[1-9]\d*|0$
     *    
     */
    public static final String INTEGER_POSITIVE = "^-[1-9]\\d*|0$";
    /**
     *    * Double正则表达式 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$
     *    
     */
    public static final String DOUBLE = "^-?([1-9]\\d*\\.\\d*|0\\.\\d*[1-9]\\d*|0?\\.0+|0)$";
    /**
     *    * 正Double正则表达式 >=0 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
     *    
     */
    public static final String DOUBLE_NEGATIVE = "^[1-9]\\d*\\.\\d*|0\\.\\d*[1-9]\\d*|0?\\.0+|0$";
    /**
     *    * 负Double正则表达式 <= 0 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
     *    
     */
    public static final String DOUBLE_POSITIVE = "^(-([1-9]\\d*\\.\\d*|0\\.\\d*[1-9]\\d*))|0?\\.0+|0$";
    /**
     *    * 年龄正则表达式 ^(?:[1-9][0-9]?|1[01][0-9]|120)$ 匹配0-120岁
     *    
     */
    public static final String AGE = "^(?:[1-9][0-9]?|1[01][0-9]|120)$";
    /**
     *       * 邮编正则表达式 [0-9]\d{5}(?!\d) 国内6位邮编
     *    
     */
    public static final String CODE = "[0-9]\\d{5}(?!\\d)";
    /**
     *    * 匹配由数字、26个英文字母或者下划线组成的字符串 ^\w+$
     *   
     */
    public static final String STR_ENG_NUM_ = "^\\w+$";
    /**
     *    * 匹配由数字和26个英文字母组成的字符串 ^[A-Za-z0-9]+$
     *    
     */
    public static final String STR_ENG_NUM = "^[A-Za-z0-9]+";
    /**
     *    * 匹配由26个英文字母组成的字符串 ^[A-Za-z]+$
     *    
     */
    public static final String STR_ENG = "^[A-Za-z]+$";
    /**
     *    * 过滤特殊字符串正则
     *    * regEx="[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~！@#￥%……&*（）——+|{}【】‘；：”“'。，、？]";
     *    
     */
    public static final String STR_SPECIAL = "[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~！@#￥%……&*（）——+|{}【】‘；：”“'。，、？]";
    /***
        * 日期正则 支持：
        * YYYY-MM-DD
        * YYYY/MM/DD
        * YYYY_MM_DD
        * YYYYMMDD
        * YYYY.MM.DD的形式
        */
    public static final String DATE_ALL = "((^((1[8-9]\\d{2})|([2-9]\\d{3}))([-\\/\\._]?)(10|12|0?[13578])([-\\/\\._]?)(3[01]|[12][0-9]|0?[1-9])$)" + "|(^((1[8-9]\\d{2})|([2-9]\\d{3}))([-\\/\\._]?)(11|0?[469])([-\\/\\._]?)(30|[12][0-9]|0?[1-9])$)" + "|(^((1[8-9]\\d{2})|([2-9]\\d{3}))([-\\/\\._]?)(0?2)([-\\/\\._]?)(2[0-8]|1[0-9]|0?[1-9])$)|(^([2468][048]00)([-\\/\\._]?)(0?2)([-\\/\\._]?)(29)$)|(^([3579][26]00)" + "([-\\/\\._]?)(0?2)([-\\/\\._]?)(29)$)" + "|(^([1][89][0][48])([-\\/\\._]?)(0?2)([-\\/\\._]?)(29)$)|(^([2-9][0-9][0][48])([-\\/\\._]?)" + "(0?2)([-\\/\\._]?)(29)$)" + "|(^([1][89][2468][048])([-\\/\\._]?)(0?2)([-\\/\\._]?)(29)$)|(^([2-9][0-9][2468][048])([-\\/\\._]?)(0?2)" + "([-\\/\\._]?)(29)$)|(^([1][89][13579][26])([-\\/\\._]?)(0?2)([-\\/\\._]?)(29)$)|" + "(^([2-9][0-9][13579][26])([-\\/\\._]?)(0?2)([-\\/\\._]?)(29)$))";
    //定义script的正则表达式
    public static final String HtmlScript = "<[\\s]*?script[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?script[\\s]*?>";
    //定义HtmlStyle
    public static final String HtmlStyle = "<[\\s]*?style[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?style[\\s]*?>";
    //定义HTML
    public static final String HtmlLabel= "<[^>]+>";
    //定义 替换空格和换行符
    public static final String BlanksBreaks= "\\s*|\t|\r|\n";
    /**
     * 判断字段是否为空 符合返回true
     * @param str
     * @return
     */
    public static  boolean strIsNull(String str) {
        return null == str || str.trim().length() <= 0 ? true : false;
    }
    /**
     * 判断字段是非空 符合返回true
     * @param str
     * @return
     */
    public static boolean StrNotNull(String str) {
        return !strIsNull(str);
    }
    /**
     * 字符串null转空
     * @param str
     * @return
     */
    public static String nullToStr(String str) {
        return strIsNull(str) ? "" : str;
    }

    /**
     * 字符串null赋值默认值
     * @param str 目标字符串
     * @param defaultStr  默认值
     * @return
     */
    public static String nullToStr(String str, String defaultStr) {
        return strIsNull(str) ? defaultStr : str;
    }
    /**
     * 判断字段是否为Email 符合返回true
     * @param str
     * @return
     */
    public static boolean isEmail(String str) {
        return regular(str, EMAIL);
    }

    /**
     * 判断是否是QQ
     * @param str
     * @return
     */
    public static boolean isQQ(String str) {
        return regular(str, QQ);
    }

    /**
     * 判断char字符串是否是中文
     * @param c
     * @return
     */
    private static boolean isChinese(char c) {
        Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
        if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
                || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
                || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
                || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
                || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
                || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
            return true;
        }
        return false;
    }
    /**
     * 判断是否中文
     * @param strName
     * @return
     */
    public static boolean isChinese(String strName) {
        char[] ch = strName.toCharArray();
        for (int i = 0; i < ch.length; i++) {
            char c = ch[i];
            if (isChinese(c)) {
                return true;
            }
        }
        return false;
    }
    /**
     * 判断是否为电话号码 符合返回true
     * @param str
     * @return
     */
    public static boolean isPhone(String str) {
        return regular(str, PHONE);
    }
    /**
     *  判断是否为手机号码 符合返回true
     * @param str
     * @return
     */
    public static boolean isMobile(String str) {
        return regular(str, MOBILE);
    }
    /**
     * 判断字段是否为数字 正负整数 正负浮点数 符合返回true
     * @param str
     * @return
     */
    public static boolean isNumber(String str) {
        return regular(str, DOUBLE);
    }
    /**
     * 判断字段是否为INTEGER 符合返回true
     * @param str
     * @return
     */
    public static boolean isInteger(String str) {
        return regular(str, INTEGER);
    }

    /**
     * 判断字段是否为正整数正则表达式 >=0 符合返回true
     * @param str
     * @return
     */
    public static boolean isIntegerNegative(String str) {
        return regular(str, INTEGER_NEGATIVE);
    }

    /**
     * * 判断字段是否为负整数正则表达式 <=0 符合返回true
     * @param str
     * @return
     */
    public static boolean isIntegerPositive(String str) {
        return regular(str, INTEGER_POSITIVE);
    }
    /**
     * 判断字段是否为DOUBLE 符合返回true
     * @param str
     * @return
     */
    public static boolean isDouble(String str) {
        return regular(str, DOUBLE);
    }

    /**
     * 判断字段是否为正浮点数正则表达式 >=0 符合返回true
     * @param str
     * @return
     */
    public static boolean isDoubleNegative(String str) {
        return regular(str, DOUBLE_NEGATIVE);
    }

    /**
     * 判断字段是否为负浮点数正则表达式 <=0 符合返回true
     * @param str
     * @return
     */
    public static boolean isDoublePositive(String str) {
        return regular(str, DOUBLE_POSITIVE);
    }

    /**
     * 日期正则 支持：
        * YYYY-MM-DD
        * YYYY/MM/DD
        * YYYY_MM_DD
        * YYYYMMDD
        * YYYY.MM.DD的形式
     * 判断字段是否为日期 符合返回ture
     * @param str
     * @return boolean
     *    
     */
    public static boolean isDate(String str) {
        return regular(str, DATE_ALL);
    }

    /**
     * * 验证YYYY-MM-dd HH:mm:ss
     * @param str
     * @return
     */
    public static boolean isDateToSecond(String str) {
        String Format="";
        if(strIsNull(str)){
            return false;
        }else if(str.indexOf(".")>-1){
            Format="yyyy.MM.dd HH:mm:ss";
        }else if(str.indexOf("/")>-1){
            Format="YYYY/MM/dd HH:mm:ss";
        }else if (str.indexOf("-")>-1){
            Format="YYYY-MM-dd HH:mm:ss";
        }else {
            return  false;
        }
        boolean convertSuccess=true;
        SimpleDateFormat format = new SimpleDateFormat(Format);
        try {
            format.setLenient(false);
            format.parse(str);
        } catch (ParseException e) {
            convertSuccess=false;
        }
        return convertSuccess;
    }
    /**
     * 判断字段是否为年龄 符合返回true
     * @param str
     * @return
     */
    public static boolean isAge(String str) {
        return regular(str, AGE);
    }
    /**
     * 判断字段是否为邮编 符合返回true
     * @param str
     * @return
     */
    public static boolean isCode(String str) {
        return regular(str, CODE);
    }
    /**
     * 判断字符串是不是全部是英文字母
     * @param str
     * @return
     */
    public static boolean isEnglish(String str) {
        return regular(str, STR_ENG);
    }
    /**
     * 判断字符串是不是全部是英文字母+数字
     * @param str
     * @return
     */
    public static boolean isEngNum(String str) {
        return regular(str, STR_ENG_NUM);
    }
    /**
     * 判断字符串是不是全部是英文字母+数字+下划线
     * @param str
     * @return
     */
    public static boolean isEngNum_(String str) {
        return regular(str, STR_ENG_NUM_);
    }
    /**
     * 过滤特殊字符串 返回过滤后的字符串
     * @param str
     * @return
     */
    public static String filterStr(String str) {
        Pattern p = Pattern.compile(STR_SPECIAL);
        Matcher m = p.matcher(str);
        return m.replaceAll("").trim();
    }
    /**
     * 匹配是否符合正则表达式pattern 匹配返回true
     * @param str 匹配的字符串
     * @param pattern 匹配模式
     * @return
     */
    private static boolean regular(String str, String pattern) {
        if (null == str || str.trim().length() <= 0) return false;
        Pattern p = Pattern.compile(pattern);
        Matcher m = p.matcher(str);
        return m.matches();
    }

    /**
     * 替换字符串
     * @param str 需要替换的字符串
     * @param pattern_reg 替换的规则
     * @return
     */
    private static String replace(String str, String pattern_reg){
        if(strIsNull(str)){
            return str;
        }
        Pattern pattern=null;
        Matcher matcher=null;
        try {
            pattern = Pattern.compile(pattern_reg,Pattern.CASE_INSENSITIVE);
            matcher = pattern.matcher(str);
            str= matcher.replaceAll("");
        }catch (Exception e){
            e.printStackTrace();
        }
        return str;
    }

    /**
     * 替换html中的Script 数据
     * @param str 需要替换的内容
     * @return String
     */
    public static String replaceHtmlScript(String str){
        return replace(str,HtmlScript);
    }
    /**
     * 替换html中的Style 标签 数据
     * @param str 需要替换的内容
     * @return String
     */
    public static String replaceHtmlStyle(String str){
        return replace(str,HtmlStyle);
    }
    /**
     * 替换html中的除开 Script 、Style 标签的 数据
     * @param str 需要替换的内容
     * @return String
     */
    public static String replaceHtmlLabel(String str){
        return replace(str,HtmlLabel);
    }

    /**
     * 替换换行符合空格
     * @param str 需要替换的内容
     * @return String
     */
    public static String replaceBlanksBreaks(String str){
        return replace(str,BlanksBreaks);
    }

    /**
     * 将html 代码替换成 text
     * @param html 需要替换html 文本
     * @return String
     */
    public static String htmlToText(String html){
        html= replaceHtmlScript(html);
        html= replaceHtmlStyle(html);
        html= replaceHtmlLabel(html);
        html= replaceBlanksBreaks(html);
        return replace(html,"&nbsp;");
    }
}
